/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import otcapp.controlador.jdialogs.supervisiones.SupervisionesAnterioresJDialogs;
import otcapp.controlador.jinternalFrame.SupervisionesPantalla;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaSupervisiones;
import otcapp.controlador.modeloTablas.ModeloTablaSupervisionesAnteriores;
import otcapp.controlador.modelocombobox.ModeloComboProfesional;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.dto.ResolucionDTO;
import otcapp.dto.SupervisionDTO;
import otcapp.entidades.Domicilio;
import otcapp.entidades.Personal;
import otcapp.experto.ExpertoConsultarPersonal;
import otcapp.experto.ExpertoConsultarPieza;
import otcapp.experto.ExpertoSupervisiones;
import otcapp.experto.excepciones.ExpertoConsultarPersonalException;
import otcapp.experto.excepciones.ExpertoConsultarPiezaException;
import otcapp.experto.excepciones.ExpertoSupervisionesException;
import otcapp.fabricas.FabricaExpertos;

/**
 *
 * @author diego
 */
public class SupervisionesControlador implements Controlador {

    private SupervisionesPantalla pantalla;
    private ExpertoSupervisiones experto;
    private ExpertoConsultarPieza consultarPiezas;
    ExpertoConsultarPersonal consultarPersonal;
    private boolean ingresandoNuevoProfesional = false;
    private ResolucionDTO piezaSeleccionada;
    private SupervisionesAnterioresJDialogs supervisionesAnterioresJDialog;

    public SupervisionesControlador() {

        pantalla = new SupervisionesPantalla();
        experto = (ExpertoSupervisiones) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.SUPERVISIONES);
        consultarPiezas = (ExpertoConsultarPieza) ((ExpertoConsultarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PIEZA));
        consultarPersonal = (ExpertoConsultarPersonal) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PERSONAL);

        pantalla.getCabeceraJPanelPrincipal().getTítulo().setText("Supervisiones");
        pantalla.getCabeceraJPanelPrincipal().getIcono().setIcon(new ImageIcon(this.getClass().getResource("../utiles/imagenes/iconos/User-Grey-48.png").getPath()));
        pantalla.getTblPiezas().setModel(new ModeloTablaSupervisiones());

        supervisionesAnterioresJDialog = new SupervisionesAnterioresJDialogs(((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        supervisionesAnterioresJDialog.setLocationRelativeTo(null);
        supervisionesAnterioresJDialog.getTblSupervisionesAnteriores().setModel(new ModeloTablaSupervisionesAnteriores());

        pantalla.getBtnBuscarPieza().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                buscarPiezas();
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });

        pantalla.getBtnNuevoPersonal().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarABMProfesional();
            }
        });

        pantalla.getTblPiezas().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarPieza();
            }
        });

        pantalla.getBtnNuevaSupervision().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPanelNuevaSupervision();
            }
        });

        pantalla.getBtnGuardarSupervision().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                crearNuevaSupervision();
            }
        });

        pantalla.getBtnMostrarSupervisionesAnteriores().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarSupervisionesAnteriores();
            }
        });

    }

    @Override
    public void iniciar() {
        limpiarPantalla();
        pantalla.getSupervisionJPanel().setVisible(false);
        try {
            pantalla.getCbxProfesional().setModel(new ModeloComboProfesional(consultarPersonal.buscarPersonal(ExpertoConsultarPersonal.TipoPersonal.TRABAJADOR_SOCIAL)));
            pantalla.getCbxTrabajadoraSocial().setModel(new ModeloComboProfesional(consultarPersonal.buscarPersonal(ExpertoConsultarPersonal.TipoPersonal.TRABAJADOR_SOCIAL)));
        } catch (ExpertoConsultarPersonalException ex) {
            System.out.println(ex.getMessage());
        }

        try {
            ((ModeloTablaSupervisiones) pantalla.getTblPiezas().getModel()).setListaElementos(consultarPiezas.buscarResolucionesNOSupervisadas());
        } catch (ExpertoConsultarPiezaException ex) {
            System.out.println(ex.getMessage());
        }


        pantalla.setVisible(true);
    }

    @Override
    public void finalizar() {
        pantalla.setVisible(false);
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        try {
            pantalla.getCbxProfesional().setModel(new ModeloComboProfesional(consultarPersonal.buscarPersonal(ExpertoConsultarPersonal.TipoPersonal.TRABAJADOR_SOCIAL)));
            pantalla.getCbxTrabajadoraSocial().setModel(new ModeloComboProfesional(consultarPersonal.buscarPersonal(ExpertoConsultarPersonal.TipoPersonal.TRABAJADOR_SOCIAL)));
        } catch (ExpertoConsultarPersonalException ex) {
            System.out.println(ex.getMessage());
        }
        if (!ingresandoNuevoProfesional) {
            iniciar();
            return;
        }
        pantalla.setVisible(true);
    }

    private void buscarPiezas() {
        pantalla.getSupervisionJPanel().setVisible(false);
        try {
            ((ModeloTabla) pantalla.getTblPiezas().getModel()).clear();
            if (pantalla.getCbxEstado().getSelectedIndex() > 0) {
                List piezas;
                switch (pantalla.getCbxEstado().getSelectedItem().toString()) {
                    case "Supervisor Asignado":
                        piezas = consultarPiezas.buscarResolucionesXEstado(ExpertoConsultarPieza.estados.ASIGNADAS);
                        break;
                    case "NO Supervisadas":
                        piezas = consultarPiezas.buscarResolucionesXEstado(ExpertoConsultarPieza.estados.NO_ASIGNADA);
                        break;
                    case "Finalizada":
                        piezas = consultarPiezas.buscarResolucionesXEstado(ExpertoConsultarPieza.estados.FINALIZADAS);
                        break;
                    case "NO Finalizada":
                        piezas = consultarPiezas.buscarResolucionesXEstado(ExpertoConsultarPieza.estados.NO_FINALIZADAS);
                        break;
                    default:
                        piezas = null;
                }
                ((ModeloTabla) pantalla.getTblPiezas().getModel()).setListaElementos(piezas);
            } else if (pantalla.getCbxProfesional().getSelectedIndex() > 0) {
                Personal prof = ((ModeloComboProfesional) pantalla.getCbxProfesional().getModel()).getItemSeleccionado();
                ((ModeloTabla) pantalla.getTblPiezas().getModel()).setListaElementos(consultarPiezas.buscarSupervisionesProfesional(prof));
            }
        } catch (ExpertoConsultarPiezaException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void limpiarPantalla() {
        ((ModeloTabla) pantalla.getTblPiezas().getModel()).clear();
        pantalla.getCbxEstado().setSelectedIndex(0);
        pantalla.getCbxProfesional().setSelectedIndex(0);
        pantalla.getCbxTrabajadoraSocial().setSelectedIndex(0);
        pantalla.getTxtCalle().setText("");
        pantalla.getTxtCalleNro().setText("");
        pantalla.getTxtFrecuenciaControl().setText("");
        pantalla.getFechaSupervisionJDate().setDate(null);
    }

    private void iniciarABMProfesional() {
        ingresandoNuevoProfesional = true;
        ((ABMPersonalControlador) ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.ABM_PERSONAL)).setRetornoSupervisiones(true);
    }

    private void seleccionarPieza() {
        int fila = pantalla.getTblPiezas().getSelectedRow();
        if (fila != -1) {
            int filaModleo = pantalla.getTblPiezas().convertRowIndexToModel(fila);
            piezaSeleccionada = (ResolucionDTO) ((ModeloTabla) pantalla.getTblPiezas().getModel()).getRow(filaModleo);
        }
    }

    private void mostrarPanelNuevaSupervision() {
        if (piezaSeleccionada != null) {
            pantalla.getSupervisionJPanel().setVisible(true);
        }
    }

    private void crearNuevaSupervision() {
        SupervisionDTO supervisionDTO = new SupervisionDTO();
        if (piezaSeleccionada != null) {
            supervisionDTO.setAsistenteSocial(((ModeloComboProfesional) pantalla.getCbxTrabajadoraSocial().getModel()).getItemSeleccionado());
            Domicilio domicilioSupervision = new Domicilio();
            domicilioSupervision.setCalle(pantalla.getTxtCalle().getText());
            domicilioSupervision.setNro(Integer.valueOf(pantalla.getTxtCalleNro().getText()));
            supervisionDTO.setDomicilioSupervision(domicilioSupervision);
            supervisionDTO.setFechaSupervision(pantalla.getFechaSupervisionJDate().getDate());
            supervisionDTO.setFrecuenciaControl(pantalla.getTxtFrecuenciaControl().getText());
            supervisionDTO.setResolucion(piezaSeleccionada);
            try {
                experto.crearNuevaSupervision(supervisionDTO);
            } catch (ExpertoSupervisionesException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "Supervision asignada correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            limpiarPantalla();
        }

    }

    private void mostrarSupervisionesAnteriores() {
        if (piezaSeleccionada != null) {
            ((ModeloTablaSupervisionesAnteriores) supervisionesAnterioresJDialog.getTblSupervisionesAnteriores().getModel()).setListaElementos(experto.getSupervisionesAnterioresPiezaID(piezaSeleccionada.getId()));
            supervisionesAnterioresJDialog.setVisible(true);
        }
    }
}
